﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Ryder_US_Webservice
{
    /// <summary>
    /// Summary description for CargoService
    /// </summary>
    [WebService(Namespace = "http://RyderUS.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class CargoService : System.Web.Services.WebService
    {
        //[WebMethod]
        //public string HelloWorld()
        //{
        //    return "Hello World";
        //}

        //[WebMethod]
        //public string Plus(int a, int b)
        //{
        //    return (a + b).ToString();
        //}

        /// <summary>
        /// Trackings the specified cargo by id.
        /// </summary>
        /// <param name="idOfCargo">The id of cargo.</param>
        /// <returns>
        /// JSON string
        /// </returns>
        [WebMethod]
        public string Tracking(int idOfCargo)
        {
            using (Breakers_RyderUSDataContext context =
            new Breakers_RyderUSDataContext(ConfigurationManager.ConnectionStrings["breakers_RyderUSConnectionString"].ConnectionString))
            {
                JObject obj = new JObject();
                try
                {
                    var query = from c in context.RUS_Cargos
                                where (c.Cargo_ID == idOfCargo && c.Cargo_trash == 0)
                                select c;
                    //new
                    //           {
                    //               ID = c.Cargo_ID,
                    //               SenderName = c.RUS_Customer.Customer_name,
                    //               SenderPhone = c.RUS_Customer.Customer_phone,
                    //               SenderAddress = c.RUS_Customer.Customer_address,
                    //               ReceiverName = c.Cargo_receiver,
                    //               ReceiverPhone = c.Cargo_receivePhone,
                    //               ReceiverAddress = c.Cargo_receiveAddress,
                    //               Serivce = c.RUS_ServiceDetail.ServiceDetail_name,
                    //               SendDate = c.Cargo_sendDate,
                    //               ReceiveDate = c.Cargo_receiveDate,
                    //               Count = c.Cargo_count,
                    //               Total = c.Cargo_total,
                    //               IsPaid = c.Cargo_isPaid,
                    //               PaidDate = c.Cargo_payDate,
                    //               Status = c.Cargo_status,
                    //               Life = c.Cargo_life,
                    //               Description = c.Cargo_description
                    //           };
                    RUS_Cargo crg = query.SingleOrDefault<RUS_Cargo>();
                    if (crg == null)
                    {
                        obj.Add("Success", false);
                        obj.Add("ErrorKey", "RUS_WRONG_CARGO_ID");
                        obj.Add("ErrorMessage", "Sai mã đơn hàng");
                        return obj.ToString();
                    }
                    obj.Add("Success", true);
                    obj.Add("CargoID", crg.Cargo_ID);
                    obj.Add("SenderName", crg.Cargo_sender);
                    obj.Add("ReceiverName", crg.Cargo_receiver);
                    obj.Add("ReceiverPhone", crg.Cargo_receivePhone);
                    obj.Add("ReceiverAddress", crg.Cargo_receiveAddress);
                    obj.Add("Serivce", crg.RUS_ServiceDetail.ServiceDetail_name);
                    obj.Add("SendDate", crg.Cargo_sendDate);
                    obj.Add("Quantity", crg.Cargo_count);
                    obj.Add("Total", crg.Cargo_total);
                    obj.Add("IsPaid", crg.Cargo_isPaid);
                    obj.Add("PaidMoney", crg.Cargo_paidMoney);
                    obj.Add("Status", crg.RUS_CargoStatus.CargoStatus_name);
                    obj.Add("Description", crg.Cargo_description);
                    return obj.ToString();
                }
                catch (Exception ex)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_WRONG_CARGO_ID");
                    obj.Add("ErrorMessage", "Sai mã đơn hàng");
                    return obj.ToString();
                }
            }
        }

        /// <summary>
        /// Lấy danh sách các dịch vụ vận chuyển.
        /// </summary>
        /// <returns>
        /// Chuỗi JSON
        /// </returns>
        [WebMethod]
        public string GetServiceDetails()
        {
            using (Breakers_RyderUSDataContext context =
            new Breakers_RyderUSDataContext(ConfigurationManager.ConnectionStrings["breakers_RyderUSConnectionString"].ConnectionString))
            {
                var query = from sd in context.RUS_ServiceDetails
                            where (sd.RUS_Service.Service_trash == 0 && sd.ServiceDetail_trash == 0)
                            select new
                                       {
                                           ID = sd.ServiceDetail_ID,
                                           Type = sd.RUS_Service.Service_name,
                                           Name = sd.ServiceDetail_name,
                                           Unit = sd.ServiceDetail_unit,
                                           Max = sd.ServiceDetail_unitMax,
                                           Min = sd.ServiceDetail_unitMin,
                                           Price = sd.ServiceDetail_price,
                                           Description = sd.ServiceDetail_description
                                       };
                JObject obj = new JObject();
                if (query.Count() < 1)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_THERE_IS_NO_SERVICE");
                    obj.Add("ErrorMessage", "Không lấy được danh sách dịch vụ.");
                    return obj.ToString();
                }
                obj.Add("Success", true);
                obj.Add("ItemNum", query.Count());
                obj.Add("List", JsonConvert.SerializeObject(query.ToList()));
                return obj.ToString();
            }
        }

        /// <summary>
        /// Đăng ký gửi hàng.
        /// </summary>
        /// <param name="serviceDetailID">ID của dịch vụ.</param>
        /// <param name="quantity">Số lượng.</param>
        /// <param name="username">Tên đăng nhập của khách hàng.</param>
        /// <param name="password">Mật khẩu của khách hàng.</param>
        /// <param name="receiverName">Tên người nhận.</param>
        /// <param name="receiverPhone">Số điện thoại của người nhận.</param>
        /// <param name="receiverAddress">Địa chỉ người nhận</param>
        /// <param name="description">Mô tả thông tin đơn hàng.</param>
        /// <returns>
        /// Chuỗi JSON
        /// </returns>
        [WebMethod]
        public string FillCargo(int serviceDetailID, int quantity, String username, String password, String receiverName, String receiverPhone, String receiverAddress, String description)
        {
            using (Breakers_RyderUSDataContext context =
            new Breakers_RyderUSDataContext(ConfigurationManager.ConnectionStrings["breakers_RyderUSConnectionString"].ConnectionString))
            {
                JObject obj = new JObject();
                var queryServiceDetail = from sd in context.RUS_ServiceDetails
                                         where sd.ServiceDetail_ID == serviceDetailID && sd.ServiceDetail_trash==0
                                         select sd;
                RUS_ServiceDetail serviceDetail = queryServiceDetail.SingleOrDefault<RUS_ServiceDetail>();
                if (queryServiceDetail.Count() != 1 || serviceDetail == null)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_SERVICE_DOES_NOT_EXIST");
                    obj.Add("ErrorMessage", "Không tồn tại dịch vụ này.");
                    return obj.ToString();
                }
                if (quantity < 1)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_QUANTITY_MUST_LARGER_THAN_0");
                    obj.Add("ErrorMessage", "Số lượng phải lớn hơn 0.");
                    return obj.ToString();
                }
                if (quantity < serviceDetail.ServiceDetail_unitMin)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_QUANTITY_MUST_LARGER_THAN_MIN");
                    obj.Add("ErrorMessage", "Số lượng phải lớn hơn số lượng tối thiểu của dịch vụ.");                   
                    return obj.ToString();
                }
                if (quantity > serviceDetail.ServiceDetail_unitMax)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_QUANTITY_MUST_LESS_THAN_MAX");
                    obj.Add("ErrorMessage", "Số lượng phải nhỏ hơn số lượng tối đa của dịch vụ.");
                    return obj.ToString();
                }
                if (String.IsNullOrEmpty(username))
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_USERNAME_IS_EMPTY");
                    obj.Add("ErrorMessage", "Không được để trống tên đăng nhập.");
                    return obj.ToString();
                }
                if (String.IsNullOrEmpty(password))
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_PASSWORD_IS_EMPTY");
                    obj.Add("ErrorMessage", "Không được để trống mật khẩu.");
                    return obj.ToString();
                }
                if (String.IsNullOrEmpty(receiverName))
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_RECEIVER_NAME_IS_EMPTY");
                    obj.Add("ErrorMessage", "Không được để trống tên người nhận.");
                    return obj.ToString();
                }
                if (String.IsNullOrEmpty(receiverPhone))
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_RECEIVER_PHONE_IS_EMPTY");
                    obj.Add("ErrorMessage", "Không được để trống số điện thoại của người nhận.");
                    return obj.ToString();
                }

                if (String.IsNullOrEmpty(receiverAddress))
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_RECEIVER_ADDRESS_IS_EMPTY");
                    obj.Add("ErrorMessage", "Không được để trống địa chỉ người nhận.");
                    return obj.ToString();
                }
                var queryCustomer = from c in context.RUS_Customers
                                    where
                                        (c.Customer_username == username &&
                                         c.Customer_password == UtilHelpers.MD5Encode(password) && c.Customer_trash == 0)
                                    select c;
                RUS_Customer cus = queryCustomer.SingleOrDefault<RUS_Customer>();
                if (queryCustomer.Count() != 1 || cus == null)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_WRONG_USERNAME_OR_PASSWORD");
                    obj.Add("ErrorMessage", "Sai tên đăng nhập hoặc mật khẩu.");
                    return obj.ToString();
                }

                RUS_Cargo cargo = null;
                // Thêm đơn hàng vào databse.
                try
                {
                    cargo = new RUS_Cargo();
                    cargo.Cargo_count = quantity;
                    cargo.Cargo_description = description;
                    cargo.Cargo_isPaid = 0;
                    cargo.Cargo_paidMoney = 0;
                    cargo.Cargo_receiveAddress = receiverAddress;
                    cargo.Cargo_receivePhone = receiverPhone;
                    cargo.Cargo_receiver = receiverName;
                    cargo.Cargo_sendDate = DateTime.Now;
                    cargo.Cargo_sender = cus.Customer_ID;
                    cargo.Cargo_serviceDetailID = serviceDetailID;
                    cargo.Cargo_status = 1;
                    cargo.Cargo_total = quantity * serviceDetail.ServiceDetail_price;
                    context.RUS_Cargos.InsertOnSubmit(cargo);
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_CANNOT_SEND_CARGO");
                    obj.Add("ErrorMessage", "Không thể gửi đơn hàng.");
                    return obj.ToString();
                }
                obj.Add("Success", true);
                obj.Add("CargoID", cargo.Cargo_ID);
                obj.Add("SenderName", cus.Customer_name);
                obj.Add("SenderAddress", cus.Customer_address);
                obj.Add("SenderPhone", cus.Customer_phone);
                obj.Add("ReceiverName", receiverName);
                obj.Add("ReceiverAddress", receiverAddress);
                obj.Add("ReceiverPhone", receiverPhone);
                obj.Add("Service", serviceDetail.ServiceDetail_name);
                obj.Add("Quantity", quantity);
                obj.Add("ServiceUnit", serviceDetail.ServiceDetail_unit);
                obj.Add("Total", quantity * serviceDetail.ServiceDetail_price);
                obj.Add("Description", description);
                return obj.ToString();
            }
        }

        /// <summary>
        /// Lấy ra số nợ của khách hàng.
        /// </summary>
        /// <param name="username">Tên đăng nhập.</param>
        /// <param name="password">Mật khẩu.</param>
        /// <returns></returns>
        [WebMethod]
        public string GetDoubt(String username, String password)
        {
            using (Breakers_RyderUSDataContext context =
            new Breakers_RyderUSDataContext(ConfigurationManager.ConnectionStrings["breakers_RyderUSConnectionString"].ConnectionString))
            {
                JObject obj = new JObject();
                try
                {
                    var query = from cus in context.RUS_Customers
                                where (cus.Customer_username == username &&
                                       cus.Customer_password == UtilHelpers.MD5Encode(password) &&
                                       cus.Customer_trash == 0)
                                select cus;

                    RUS_Customer customer = query.SingleOrDefault<RUS_Customer>();
                    if (query.Count() != 1 || customer == null)
                    {
                        obj.Add("Success", false);
                        obj.Add("ErrorKey", "RUS_WRONG_USERNAME_OR_PASSWORD");
                        obj.Add("ErrorMessage", "Sai tên đăng nhập hoặc mật khẩu.");
                        return obj.ToString();
                    }

                    obj.Add("Success", true);
                    obj.Add("username", customer.Customer_username);
                    obj.Add("name", customer.Customer_name);
                    obj.Add("doubt", customer.Customer_doubt);
                    obj.Add("phone", customer.Customer_phone);
                    obj.Add("address", customer.Customer_address);

                    if(customer.Customer_doubt>0)
                    {
                        var queryCargo = from car in context.RUS_Cargos
                                         where (car.RUS_Customer.Customer_ID == customer.Customer_ID && car.Cargo_paidMoney < car.Cargo_total && car.Cargo_trash == 0)
                                         select new
                                                    {
                                                        CargoID = car.Cargo_ID,
                                                        Service = car.RUS_ServiceDetail.ServiceDetail_name,
                                                        Quantity = car.Cargo_count,
                                                        Sender = car.RUS_Customer.Customer_name,
                                                        SendDate = car.Cargo_sendDate,
                                                        Receiver = car.Cargo_receiver,
                                                        ReceiverPhone = car.Cargo_receivePhone,
                                                        ReceiverAddress = car.Cargo_receiveAddress,
                                                        Description = car.Cargo_description,
                                                        Total = car.Cargo_total,
                                                        Paid = car.Cargo_paidMoney
                                                    };
                        obj.Add("ItemNum", queryCargo.Count());
                        obj.Add("List", JsonConvert.SerializeObject(queryCargo.ToList()));
                    }
                }
                catch (Exception ex)
                {
                    obj.Add("Success", false);
                    obj.Add("ErrorKey", "RUS_WRONG_USERNAME_OR_PASSWORD");
                    obj.Add("ErrorMessage", "Sai tên đăng nhập hoặc mật khẩu.");
                    return obj.ToString();
                }
                return obj.ToString();
            }
        }
    }
}
